﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GOFtest
{
    public partial class C21_ToolBox : Form
    {
        private static C21_ToolBox tb = null;
        private static readonly object syncLock = new object();//创建一个静态只读的对象当作lock

        //把构造方法私有，外部代码不能直接NEW它
        private C21_ToolBox()
        {
            InitializeComponent();
        }

        public static C21_ToolBox GetInstance() //得到类实例的方法，注意是静态的(否则其他类调不到这个方法)
        {
            if (tb == null || tb.IsDisposed) //在外面再套一层判断，如果已经实例化过了就不用再加锁判断了
            {
                lock (syncLock) //加锁以后同一时刻只有一个线程可以进入，但是每次访问都要加锁会浪费资源
                {
                    //**里面这层tb==null不能省略，如果有两个线程同时进入，A线程进入临界区创建了实例，B线程因为里面没有NULL判断
                    //会再次创建实例
                    if (tb == null || tb.IsDisposed)   //关闭新窗口时，是处于Disposed状态，并不是NULL
                    {
                        tb = new C21_ToolBox();
                        //父窗体设为打开本窗体的C21_Singeton，此时将实例化的对象存在静态变量tb中，以后就不用实例化就能得到了
                        tb.MdiParent = C21_Singeton.ActiveForm;
                    }
                }
            }

            return tb;
        }

    }
}
